﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;

namespace AvaProvi
{
    [Serializable]
    public class clsEnfoqueMercadoRenta_CRN:clsEnfoqueBase,IControlEstados
    {
        #region Variables
        private double dbFactorConservacion;
        private double dbFactorCalidad;
        #endregion

        #region Propiedades de clase
        public string NumExterior { get; set; }
        public string NumInterior { get; set; }
        public int Edad { get; set; }
        public double RentaMensual { get; set; }
        public double SuperficieConstruccion { get; set; }
        public double RentaM2
        {
            get
            {
                if (this.SuperficieConstruccion > 0)
                    return this.RentaMensual / SuperficieConstruccion;
                else
                    return 0;
            }
        }
        public double FactorEdad
        {
            get
            {
                double Fedad = 1;
                if (this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.TiposDeConstruccion.Count > 0)
                {
                    double Vp, Vur, resultado, resultado2;
                    clsTipoDeConstruccion_CRN objConstruccion = (clsTipoDeConstruccion_CRN)this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.TiposDeConstruccion[0];
                    Vp = Convert.ToDouble(objConstruccion.VP);
                    Vur = Convert.ToDouble(objConstruccion.VUR);
                    resultado = ((Vur * 0.9) + (Vp * 0.1)) / Vp;
                    resultado2 = (((Vp - this.Edad) * 0.9) + (Vp * 0.1)) / Vp;
                    Fedad = resultado / resultado2;
                }
                return Fedad;
            }
        }
        public double AjusteM2Fcus
        {
            get
            {
                double resultado = 0;
                if ((this.SuperficieDeTerreno != 0) && (this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.SuperficieDeTerreno != 0))
                {
                    resultado = ((this.SuperficieConstruccion / this.SuperficieDeTerreno) / (Convert.ToDouble(this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.SuperficieTotalDeConstruccion) / Convert.ToDouble(this.SuperficieDeTerreno)));
                    return Math.Pow(resultado, 0.14);
                }
                return 0;
            }
        }
        public double FactorConservacion
        {
            get { return dbFactorConservacion; }
            set
            {
                if (!this.FactorValido(value))
                    dbFactorConservacion = 1;
                else
                    dbFactorConservacion = value;
            }
        }
        public double FactorCalidad
        {
            get { return dbFactorCalidad; }
            set
            {
                if (!this.FactorValido(value))
                    dbFactorCalidad = 1;
                else
                    dbFactorCalidad = value;
            }
        }
        public double RentaPorM2Homologado
        {
            get
            {
                return this.FactorDeReferencia * this.RentaM2;
            }
        }
        #endregion

        #region Constructor
        public clsEnfoqueMercadoRenta_CRN(clsEnfoqueDeMercado_CRN objEnfoque):base(objEnfoque)
        {
            this.NumExterior = string.Empty;
            this.NumInterior = string.Empty;
            this.Edad = 0;
            this.RentaMensual = 0;
            this.FactorConservacion = 1;
            this.FactorCalidad = 1;
        }
        #endregion

        #region Métodos

        public bool Guardar()
        {
            if (this.DatosValidos())
            {
                if (this.EsNuevo)
                    return CreaEnfoqueMRenta();
                else
                {
                    if (this.EsModificado)
                        return ActualizaEnfoqueMRenta();
                    else
                        return EliminaEnfoqueMRenta();
                }
            }
            return false;
        }

        private bool EliminaEnfoqueMRenta()
        {
            clsEnfoqueMercadoRenta_CD objEnfoqueMercado_CD = new clsEnfoqueMercadoRenta_CD();
            return objEnfoqueMercado_CD.EliminaEnfoqueMRenta(this);
        }

        private bool ActualizaEnfoqueMRenta()
        {
            clsEnfoqueMercadoRenta_CD objEnfoqueMercado_CD = new clsEnfoqueMercadoRenta_CD();
            return objEnfoqueMercado_CD.ModificaEnfoqueMRenta(this);
        }

        private bool CreaEnfoqueMRenta()
        {
            clsEnfoqueMercadoRenta_CD objEnfoqueMercado_CD = new clsEnfoqueMercadoRenta_CD();
            return objEnfoqueMercado_CD.NuevoEnfoqueMRenta(this);
        }

        public bool DatosValidos()
        {
            if ((this.FactorOtro != 1) && (this.Justificacion.Length == 0))
            {
                MessageBox.Show("Debe de escribir la Justificación de porqué el Factor Otro es diferente a 0\nLos datos se guardarán hasta que corrija sus datos", "Ingresar Justificación de " + this.Etiqueta, MessageBoxButtons.OK, MessageBoxIcon.Information);
                return false;
            }
            return true;
        }

        public override double ObtieneFactorDeReferencia()
        {
            return this.FactorCalidad * this.FactorComercializacion * this.FactorConservacion * this.FactorEdad * this.FactorOtro * this.FactorSuperficie * this.FactorUbicacion * this.FactorZona;
        }

        public override double ObtieneFactorSuperficie()
        {
            if (this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.SuperficieTotalDeConstruccion > 0)
            {
                double resultado = this.SuperficieConstruccion / Convert.ToDouble(this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.SuperficieTotalDeConstruccion);
                return Math.Pow(resultado, 1 / 6);
            }
            else
                return 0;
        }

        public static BindingList<clsEnfoqueMercadoRenta_CRN> RecuperaEnfoquesDeMRenta(clsEnfoqueDeMercado_CRN objEnfoque)
        {
            BindingList<clsEnfoqueMercadoRenta_CRN> blEnfoques = new BindingList<clsEnfoqueMercadoRenta_CRN>();
            clsEnfoqueMercadoRenta_CD objEnfoqueMercado_CD = new clsEnfoqueMercadoRenta_CD();
            BindingList<dsEnfoqueDeMercado.EnfoqueMercadoRentaRow> blEnfoquesRecuperados = objEnfoqueMercado_CD.RecuperaEnfoquesRenta(objEnfoque.Inmueble.Avaluo.IdAvaluo);
            foreach (dsEnfoqueDeMercado.EnfoqueMercadoRentaRow filaEnfoque in blEnfoquesRecuperados)
            {
                clsEnfoqueMercadoRenta_CRN objEnfoqueMR = new clsEnfoqueMercadoRenta_CRN(objEnfoque);
                objEnfoqueMR.CalidadDeZona = filaEnfoque.CalidadZona;
                objEnfoqueMR.Calle = filaEnfoque.Calle;
                objEnfoqueMR.Colonia = filaEnfoque.Colonia;
                objEnfoqueMR.CP = filaEnfoque.CP;
                objEnfoqueMR.Edad = filaEnfoque.Edad;
                objEnfoqueMR.EsModificado = true;
                objEnfoqueMR.Etiqueta = filaEnfoque.Etiqueta;
                objEnfoqueMR.FactorCalidad = filaEnfoque.FactorCalidad;
                objEnfoqueMR.FactorComercializacion = filaEnfoque.FactorComercializacion;
                objEnfoqueMR.FactorConservacion = filaEnfoque.FactorConservacion;
                objEnfoqueMR.FactorOtro = filaEnfoque.FactorOtro;
                objEnfoqueMR.FactorUbicacion = filaEnfoque.FactorUbicacion;
                objEnfoqueMR.FactorZona = filaEnfoque.FactorZona;
                objEnfoqueMR.FechaDeInvestigacion = filaEnfoque.FechaInvest;
                objEnfoqueMR.Fuente = filaEnfoque.Fuente;
                objEnfoqueMR.IDEnfoque = filaEnfoque.IDEnfoque;
                objEnfoqueMR.Informes = filaEnfoque.Informes;
                objEnfoqueMR.Justificacion = filaEnfoque.Justificacion;
                objEnfoqueMR.NumExterior = filaEnfoque.NoExt;
                objEnfoqueMR.NumInterior = filaEnfoque.NoInt;
                objEnfoqueMR.RentaMensual = filaEnfoque.RentaMensual;
                objEnfoqueMR.SuperficieConstruccion = filaEnfoque.SupConstruccion;
                objEnfoqueMR.SuperficieDeTerreno = filaEnfoque.SupTerreno;
                objEnfoqueMR.Telefono = filaEnfoque.Telefono;
                objEnfoqueMR.TipoInmueble = filaEnfoque.TipoInmueble;
                objEnfoqueMR.UsoSuelo = filaEnfoque.UsoSuelo;
                blEnfoques.Add(objEnfoqueMR);
            }
            return blEnfoques;
        }

        public override void Pegar(object objEnfoque)
        {
            if ((objEnfoque is clsEnfoqueMercadoRenta_CRN) && (objEnfoque != null))
            {
                base.Pegar(objEnfoque);
                clsEnfoqueMercadoRenta_CRN objEnfoqueRenta = (clsEnfoqueMercadoRenta_CRN)(objEnfoque);
                this.NumExterior = objEnfoqueRenta.NumExterior;
                this.NumInterior = objEnfoqueRenta.NumInterior;
                this.Edad = objEnfoqueRenta.Edad;
                this.RentaMensual = objEnfoqueRenta.RentaMensual;
                this.SuperficieConstruccion = objEnfoqueRenta.SuperficieConstruccion;
                this.FactorCalidad = objEnfoqueRenta.FactorCalidad;
                this.FactorConservacion = objEnfoqueRenta.FactorConservacion;
            }
            else
            {
                MessageBox.Show("Aun no ha copiado ningún comparativo de Rentas", "Error al copiar", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

     
    }
}
